package com.ruoyi.web.controller.system;

import cn.dev33.satoken.secure.BCrypt;
import cn.hutool.core.io.FileUtil;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.annotation.RepeatSubmit;
import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.helper.LoginHelper;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.file.MimeTypeUtils;
import com.ruoyi.hxf.service.ITypeService;
import com.ruoyi.system.domain.App;
import com.ruoyi.system.domain.SysOss;
import com.ruoyi.system.domain.vo.SysOssVo;
import com.ruoyi.system.service.ISysOssService;
import com.ruoyi.system.service.ISysUserService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.MediaType;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.*;

/**
 * 个人信息 业务处理
 *
 * @author Lion Li
 */
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/system/user/profile")
public class SysProfileController extends BaseController {

    private final ISysUserService userService;
    private final ISysOssService iSysOssService;
    private final ITypeService iTypeService;

    /**
     * 个人信息
     */
    @GetMapping
    public R<Map<String, Object>> profile() {
        SysUser user = userService.selectUserById(getUserId());
        Map<String, Object> ajax = new HashMap<>();
        ajax.put("user", user);
        ajax.put("roleGroup", userService.selectUserRoleGroup(user.getUserName()));
        ajax.put("postGroup", userService.selectUserPostGroup(user.getUserName()));
        return R.ok(ajax);
    }

    /**
     * 修改用户
     */
    @Log(title = "个人信息", businessType = BusinessType.UPDATE)
    @PutMapping
    public R<Void> updateProfile(@RequestBody SysUser user) {
        if (StringUtils.isNotEmpty(user.getPhonenumber())
            && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) {
            System.out.println(user);
            System.out.println(userService.checkUserNameUnique(user));
            if(UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(user))){
                System.out.println(UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(user)));
            }else{
                return R.fail("修改用户'" + user.getUserName() + "'失败，手机号码已存在");
            }

        }
        if (StringUtils.isNotEmpty(user.getEmail())
            && UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) {
            if(UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(user))){
                System.out.println(UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(user)));
            }else{
                return R.fail("修改用户'" + user.getUserName() + "'失败，邮箱账号已存在");
            }

        }
        user.setUserId(getUserId());
        user.setUserName(null);
        user.setPassword(null);
        user.setAvatar(null);
        user.setDeptId(null);
        user.setClassId(null);
        if (userService.updateUserProfile(user) > 0) {
            return R.ok();
        }
        return R.fail("修改个人信息异常，请联系管理员");
    }

    /**
     * 重置密码
     *
     * @param newPassword 旧密码
     * @param oldPassword 新密码
     */
    @Log(title = "个人信息", businessType = BusinessType.UPDATE)
    @PutMapping("/updatePwd")
    public R<Void> updatePwd(String oldPassword, String newPassword) {
        SysUser user = userService.selectUserById(LoginHelper.getUserId());
        String userName = user.getUserName();
        String password = user.getPassword();
        if (!BCrypt.checkpw(oldPassword, password)) {
            return R.fail("修改密码失败，旧密码错误");
        }
        if (BCrypt.checkpw(newPassword, password)) {
            return R.fail("新密码不能与旧密码相同");
        }

        if (userService.resetUserPwd(userName, BCrypt.hashpw(newPassword)) > 0) {
            return R.ok();
        }
        return R.fail("修改密码异常，请联系管理员");
    }

    /**
     * 头像上传
     *
     * @param avatarfile 用户头像
     */
    @Log(title = "用户头像", businessType = BusinessType.UPDATE)
    @PostMapping(value = "/avatar", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public R<Map<String, Object>> avatar(@RequestPart("avatarfile") MultipartFile avatarfile) {
        Map<String, Object> ajax = new HashMap<>();
        if (!avatarfile.isEmpty()) {
            String extension = FileUtil.extName(avatarfile.getOriginalFilename());
            if (!StringUtils.equalsAnyIgnoreCase(extension, MimeTypeUtils.IMAGE_EXTENSION)) {
                return R.fail("文件格式不正确，请上传" + Arrays.toString(MimeTypeUtils.IMAGE_EXTENSION) + "格式");
            }
            SysOssVo oss = iSysOssService.upload(avatarfile);
            String avatar = oss.getUrl();
            if (userService.updateUserAvatar(getUsername(), avatar)) {
                ajax.put("imgUrl", avatar);
                return R.ok(ajax);
            }
        }
        return R.fail("上传图片异常，请联系管理员");
    }

    /**
     * 加入班级
     */
    @Log(title = "加入班级", businessType = BusinessType.UPDATE)
    @PutMapping("/updateUserClass/{classId}/{classPassword}")
    public R<Void> updateUserClass(@PathVariable("classId") Long classId, @PathVariable("classPassword") String classPassword) {
        String password = iTypeService.selectPasswordByDeptId(classId);
        if (password == null) {
            return R.warn("请联系班主任设置班级密码,否则无法进入");
        }
        boolean checkpw =false;
        if(password.equals(classPassword)){
            checkpw=true;
        }
        if (checkpw) {
            StringBuffer stringBuffer = new StringBuffer();
            String classParent = iTypeService.selectClassParentByDeptId(classId);
            if (classParent == null) {
                stringBuffer.append(LoginHelper.getUserId());
                iTypeService.updateClassParent(stringBuffer.toString(), classId);
            } else {
                String[] split = classParent.split(",");
                for (String s : split) {
                    if (stringBuffer.length() == 0) {
                        stringBuffer.append(s);
                    } else {
                        stringBuffer.append("," + s);
                    }
                }
                stringBuffer.append("," + LoginHelper.getUserId());
                iTypeService.updateClassParent(stringBuffer.toString(), classId);
            }
            App app = new App();
            app.setUserId(LoginHelper.getUserId());
            app.setClassId(String.valueOf(classId));
            app.setCreateTime(DateUtils.getNowDate());
            userService.updateUserClassId(app);
        } else {
            return R.warn("验证码错误,请重新输入验证码");
        }
        return R.ok();
    }

    /**
     * 退出班级
     */
    @Log(title = "退出班级", businessType = BusinessType.UPDATE)
    @PutMapping("/deleteUserClass")
    public R<Void> deleteUserClass() {

        String classId = userService.getUserClassId(LoginHelper.getUserId());
        StringBuffer stringBuffer = new StringBuffer();
        String classParent = iTypeService.selectClassParentByDeptId(Long.valueOf(classId));

        String[] split = classParent.split(",");
        for (String s : split) {
            if (!s.equals(String.valueOf(LoginHelper.getUserId()))) {
                if (stringBuffer.length() == 0) {
                    stringBuffer.append(s);
                } else {
                    stringBuffer.append("," + s);
                }
            }
        }
        if (stringBuffer.length() == 0) {
            iTypeService.updateClassParent(null, Long.valueOf(classId));
        } else {
            iTypeService.updateClassParent(stringBuffer.toString(), Long.valueOf(classId));
        }
        App app = new App();
        app.setUserId(LoginHelper.getUserId());
        app.setClassId(null);
        app.setCreateTime(null);
        userService.updateUserClassId(app);
        return R.ok();
    }

    /**
     * 个人信息
     */
    @GetMapping("/class")
    public R<App> profileClass() {

        return R.ok(userService.selectAppUserByIdNew(getUserId()));
    }

    /**
     * 个人信息
     */
    @GetMapping("/classS")
    public R<List<App>> profileClassS() {

        App app = userService.selectAppUserById(getUserId());
        System.out.println(app);
        List<App> appList=new ArrayList<>();
        if(app!=null){
            String classId = app.getClassId();
            if(classId.length()!=0){
                String[] split = classId.split(",");
                for (int i = 0; i < split.length; i++) {
                    App tmpAPP=new App();
                    tmpAPP.setId(app.getId());
                    tmpAPP.setUserId(app.getUserId());
                    tmpAPP.setClassId(String.valueOf(split[i]));
                    tmpAPP.setTypeName(userService.selectTypeName(String.valueOf(split[i])));
                    appList.add(tmpAPP);
                }
            }
            Collections.sort(appList);
        }

        return R.ok(appList);
    }

}
